//地上有一个m行n列的方格，从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动，它每次可以向左、右、上、下移动一
//格（不能移动到方格外），也不能进入行坐标和列坐标的数位之和大于k的格子。例如，当k为18时，机器人能够进入方格 [35, 37] ，因为3+5+3+7=18。但
//它不能进入方格 [35, 38]，因为3+5+3+8=19。请问该机器人能够到达多少个格子？ 
//
// 
//
// 示例 1： 
//
// 输入：m = 2, n = 3, k = 1
//输出：3
// 
//
// 示例 2： 
//
// 输入：m = 3, n = 1, k = 0
//输出：1
// 
//
// 提示： 
//
// 
// 1 <= n,m <= 100 
// 0 <= k <= 20 
// 
//
// Related Topics 深度优先搜索 广度优先搜索 动态规划 👍 650 👎 0


package leetcode.editor.cn;

import java.util.LinkedList;
import java.util.Queue;

class 机器人的运动范围{
    public static void main(String[] args) {
        Solution solution = new 机器人的运动范围().new Solution();
        // TO TEST
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
        int[][] directions = {{0,1},{1,0}};

        public int movingCount(int m, int n, int k) {
            boolean[][] visited = new boolean[m][n];
            int res = 0;
            Queue<int[]> queue = new LinkedList<>();
            queue.add(new int[]{0,0,0,0});
            while (!queue.isEmpty()){
                int[] x = queue.poll();
                int i = x[0], j = x[1], si = x[2], sj = x[3];
                if (i >= m || j >= n || si + sj > k || visited[i][j]) continue;
                visited[i][j] = true;
                res++;
                queue.add(new int[]{i+1,j,(i+1) % 10 == 0 ? si - 8 : si + 1, sj});
                queue.add(new int[]{i,j+1,si,(j+1) % 10 == 0 ? sj - 8 : sj + 1});
            }
            return res;
        }
    public int movingCount1(int m, int n, int k) {
        boolean[][] visited = new boolean[m][n];
        return dfs(visited,m,n,k,0,0,0);
    }
    
    public int dfs(boolean[][] visited, int m, int n, int k, int i, int j, int res){
        if (i >= m || j >= n || visited[i][j]) return res;
        visited[i][j] = true;
        if (cul(i,j) > k) return res;
        res++;
        for (int l = 0; l < 2; l++) {
            res = dfs(visited,m,n,k,i + directions[l][0],j + directions[l][1],res);
        }
        return res;
    }
    
    public int cul(int a,int b){
        int sum = 0;
        while (a != 0){
            sum += a % 10;
            a /= 10;
        }
        while (b != 0){
            sum += b % 10;
            b /= 10;
        }
        return sum;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}

